package com.leecode.string;

import java.util.ArrayDeque;
import java.util.Deque;

/**
 * 简化路径,
 * 以 Unix 风格给出一个文件的绝对路径，你需要简化它。或者换句话说，将其转换为规范路径。 *
 * 在 Unix 风格的文件系统中，一个点（.）表示当前目录本身；此外，两个点 （..） 表示将目录切换到上一级（指向父目录）；两者都可以是复杂相对路径的组成部分。更多信息请参阅：Linux / Unix中的绝对路径 vs 相对路径
 * 请注意，返回的规范路径必须始终以斜杠 / 开头，并且两个目录名之间必须只有一个斜杠 /。最后一个目录名（如果存在）不能以 / 结尾。此外，规范路径必须是表示绝对路径的最短字符串。
 */
public class UrlSimplifyMain {
	public static void main(String[] args) {
		System.out.println(simplifyPath("/home//foo/"));
		System.out.println(simplifyPath("/a//b////c/d//././/.."));
		System.out.println(simplifyPath("/a/./b/../../c/"));
	}

	/**
	 * 想到了,用stack
	 */
	public static String simplifyPath(String path) {
		if (path.length() == 1) {

		}
		Deque<String> deque = new ArrayDeque();
		deque.addLast("/");

		int i = 1, j = 1;
		//从1开始找,跳过所有的重复的/
		while (i <= path.length() - 1) {
			//若是重复的/,next,i想找到第一个不是/的,
			while (i <= path.length() - 1 && path.charAt(i) == '/') i++;
			//找到第一个不是/的,
			j = i;
			//j开始往后找,希望找到是/的,不是/的,j都跳过
			while (j <= path.length() - 1 && path.charAt(j) != '/') j++;

			String substr = path.substring(i, j);
			if (!substr.equals("")) {
				//parse substr
				switch (substr) {
					case ".":
						break;
					case "..":
						//若是栈顶,doNothing
						if (!deque.peekLast().equals("/")) {
							deque.pollLast();
						}else{

						}
						break;
					default:
						deque.addLast(substr);
						break;
				}
				//第一个下常目录解析完后,把i的位置住右拉到j的位置
				i = j;

			}
		}

		if (deque.size()==1) {
			return "/";
		}

		StringBuilder stringBuilder = new StringBuilder("");
		String s = deque.pollFirst();
		while (s != null) {
			stringBuilder.append("/" + s);
			s = deque.pollFirst();
		}
		return stringBuilder.substring(2);
	}
}
